﻿// <copyright file="XmlTreeComposite.cs" company="graphs-dotnet">
// Copyright 2009 Dmitri Pavlenkov
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// THIRD PARTY LICENSES
//
// This file's code annotations follow David Betz' Code Annotation Format.
// The orignal can be obtained at
//
// http://www.netfxharmonics.com/document/code/format
//
// </copyright>
// <summary>
// XmlTreeComposite.cs file.
// </summary>
//+

namespace Graphs.Impl
{
  using System;
  //+
  using Graphs.Core;
  //+
  
  /// <summary>
  /// XmlTreeComposite.
  /// </summary>
  public class XmlTreeComposite<E> : TreeComposite<E>
    where E : class
  {
    //+ field
    private IXmlComposite<E> generator;
    
    //- @Indexer -//
    public XmlTreeComposite<E> this[E edge]
    {
      get
      {
        return base[edge] as XmlTreeComposite<E>;
      }
    }
    //- @XmlGenerator -//
    public IXmlComposite<E> XmlGenerator
    { get
      {
        return generator;
      }
      set
      {
        generator=value;
        generator.AddChildren(this);
      }
    }

    //+
    //- @Follow -//
    /// <inheritdoc cref="M:Graphs.Core.INode`1.Follow(`0)"/>
    /// <summary>
    /// Adds node if doesn't exist.
    /// </summary>
    public override IVertex<E> Follow(E edge)
    {
      if(EdgeMap.ContainsKey(edge)) 
      {
        return EdgeMap[edge];
      } 
      else
      {
        XmlTreeComposite<E> node=new XmlTreeComposite<E>();
        EdgeMap[edge]=node;
        //+
        return node;
      }
    }

  }
}
